//:C05:BearCorner.cpp
// Illustrates traits classes.
#include <iostream>
#include "BearCorner.h"
using namespace std;

// A custom traits class 
class MixedUpTraits
{
    public:
        typedef Milk beverage_type;
        typedef Honey snack_type;
};

// The Guest template (uses a traits class)
template<class Guest, class traits = GuestTraits<Guest>>
class BearCorner
{
    Guest theGuest;
    typedef typename traits::beverage_type beverage_type;
    typedef typename traits::snack_type snack_type;
    beverage_type bev;
    snack_type snack;
    public:
        BearCorner(const Guest& g)  : theGuest(g){}
        void entertain()
        {
            cout << "Entertaining " << theGuest
                 << " serving " << bev
                 << " and " << snack << endl;
        }
};

int main(void) 
{
    Boy cr;
    BearCorner<Boy> pc1(cr);
    pc1.entertain();
    Bear pb;
    BearCorner<Bear> pc2(pb);
    pc2.entertain();
    BearCorner<Bear, MixedUpTraits> pc3(pb);
    pc3.entertain();
}